#include <stdio.h>
#include <stdlib.h>
#include "headers/const.h"
#include "headers/position.h"
#include "headers/verification.h"
#include "headers/ia.h"
#include "headers/grille.h"
#include "headers/affich.h"


void creerArbre(posia p, int h, int col)
{
	int i;

	if(h < (COLONNE*(LIGNE-1))) {
		p->colonne = col;
		
		for(i=0; i<COLONNE; i++)
		{
			p->tabPosJouable[i] = (posia) malloc(sizeof(struct positionia));
			creerArbre(p->tabPosJouable[i], h+1, i);
		}
	}
}

void parcoursArbre(posia p)
{
	int i;
	
	if(p != NULL) {
		for(i=0; i<COLONNE; i++) {
			printf("colonne posIA=%d\n", p->colonne);
			parcoursArbre(p->tabPosJouable[i]);
		}
	}
}

void calculIA(char grille[LIGNE][COLONNE], posia p, int profondeur)
{
	int max = -1000;

	int i;
	int tmp=0;	
	
	for(i=0; i<COLONNE; i++)
	{
		printf(" CALCULIA : %d \n",i);
		if(placerPion(i, grille, JOUEUR2)) { // On simule le coup
			tmp = min(grille, p->tabPosJouable[i], profondeur-1);
			affichPlateau(grille);
		printf("\n   <------------------------------ %d \n \n\n", i);
		
			if(tmp > max){ // si victoire ou défaite
				max = tmp;
				p->colonneConseillee = i;
				printf("\n IA CALCUL IA : COLONNE CONSEILLE %d \n", p->colonneConseillee+1);
			}
			placerPion(i, grille, VIDE); // On annule le coup
		}
	}
	printf("\n\n IA JOU : COLONNE CONSEILLE %d", p->colonneConseillee+1);
	placerPion(p->colonneConseillee, grille, JOUEUR2);	
}

int min(char grille[LIGNE][COLONNE], posia p, int profondeur)
{
	 
	int i;
	int min = 1000;
	int tmp;
	char joueur; 
	
	if(calcNbCoup(grille)%2 == 0)
		joueur = JOUEUR1;
	else
		joueur = JOUEUR2;
		
	if(profondeur == 0){
		return eval(grille, p, joueur);}
		
//	if(calcNbCoup(grille) == LIGNE*COLONNE) // Partie terminée
	//	return eval(grille, p, joueur);
		
	for(i=0; i<COLONNE; i++)
	{
		if(placerPion(i, grille, joueur)) { // On simule le coup
			tmp = max(grille, p->tabPosJouable[i], profondeur-1);
			affichPlateau(grille);
			printf("\n [MIN] i:%d tmp: %d", i, tmp);
		printf("\n   <------------------------------ %d \n \n\n", i);
				
			if(tmp < min){
				min = tmp;
				p->colonneConseillee = i;
				printf("\n IA MIN : COLONNE CONSEILLE %d \n", p->colonneConseillee+1);
			
			}
			placerPion(i, grille, VIDE); // On annule le coup
		}
		
 		}
 		return min;
}
	

int max(char grille[LIGNE][COLONNE], posia p, int profondeur)
{
	int i;
	int max = -1000;
	int tmp;
	char joueur;
	
	if(calcNbCoup(grille)%2 == 0)
		joueur = JOUEUR1;
	else
		joueur = JOUEUR2;
	
	if(profondeur == 0){
		return eval(grille, p, joueur);}
		
	for(i=0; i<COLONNE; i++)
	{
		if(placerPion(i, grille, joueur)) { // On simule le coup
			tmp = min(grille, p->tabPosJouable[i], profondeur-1);
			affichPlateau(grille);
			printf("\n [MAX] i:%d tmp: %d", i, tmp);
			printf("\n   <------------------------------ %d \n \n\n",i);
			
			if(tmp > max){
				max = tmp;
				p->colonneConseillee = i;
				printf("\n IA MAX	 : COLONNE CONSEILLE %d \n", p->colonneConseillee+1);
			
			}
			placerPion(i, grille, VIDE); // On annule le coup
		}	
	}
	
	return max;
}


int eval(char grille[LIGNE][COLONNE], posia ps, char joueur)
{
	int i, nbcoup; 	
	//nbcoup = calcNbCoup(grille); 
	
	printf(" Joueur dans eval : %c", joueur);
	for(i=PUISSANCEMAX; i > 0; i--)
	{
		if(joueur == JOUEUR1){
			if(verifPuissance4(grille, ps->colonne, i)  && i == 3){// défaite
				printf("DEFAITE %d\n",i);
				return (i*(15));
			}		
			else if(verifPuissance4(grille, ps->colonne, i) && i == 2) {// 10 * nbpionaligné 
				printf("DEFAITE %d\n",i);
				return (i*(10));
			}
			else if(verifPuissance4(grille, ps->colonne, i) && i == 1) {// 10 * nbpionaligné 
				printf("DEFAITE %d\n",i);
				return (i*(5));
			}
		}
		else if(joueur == JOUEUR2){
			if(verifPuissance4(grille, ps->colonne, i) && i == 3){// victoire
				printf(" VICTOIRE ");
				return (i*(-15));
			}
			else if(verifPuissance4(grille, ps->colonne, i) && i == 2) // 10 * nbpionaligné 
			{
				printf("VICTOIRE %d\n",i);
				return (i*(-10));
			}
			else if(verifPuissance4(grille, ps->colonne, i) && i == 1) // 10 * nbpionaligné 
			{
				printf("VICTOIRE %d\n",i);
				return (i*(-5));
			}
		}
	}
	
	return 0;
}
